package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {
    // 图片存储路径
    private String localDir="E:/images";
    private String preUrl="http://image.jt.com/";
    /**
     * 业务说明：
     * 1.校验图片类型是否为jpg/png/gif
     * 2.校验文件是否为恶意程序 防止木马程序攻击
     *3.按照分目录结构存储图片
     * 4.应该让文件名不重复
     * @param file
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile file) {
        //1.校验图片类型是否为jpg/png/gif
        //1.1获取文件名 adc.jpg
        String fileName = file.getOriginalFilename();
        //1.2 将字母转换为小写
        fileName = fileName.toLowerCase();
        //1.3正则表达式写法
        if (!fileName.matches("^.+\\.(jpg|png|gif)$")){
            return null;
        }
        //2.校验文件是否为恶意程序 防止木马程序攻击 图片高度和宽度
        //2.1获取图片的高度和宽度
        try {
            //2.2获取图片的高度和宽度
            BufferedImage bufferedImage =
                    ImageIO.read(file.getInputStream());
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();
            //2.3判断图片的高度和宽度是否符合要求
            if (width==0||height==0){
                //不符合要求
                return null;
            }
        //3.按照分目录结构存储图片 年/月/日/文件名
            String datePath =
                    new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            //3.1创建图片存储的目录
            String dirPath = localDir+datePath;
            //3.2创建目录
            File dir = new File(dirPath);
            if (!dir.exists()){
                dir.mkdirs();
            }
        //4.应该让文件名不重复 使用UUID
        String uuid = UUID.randomUUID().toString();
        //4.1获取文件后缀名
        int index = fileName.lastIndexOf(".");
        String type = fileName.substring(index);
        //4.2拼接文件名
        String FileName = uuid+type;
        //5.将文件存储到服务器
            //5.1创建文件对象
            String readFilePath = dirPath+FileName;
            file.transferTo(new File(readFilePath));
        //6.返回ImageVO对象
        String virtualPath = datePath+FileName;
        //http://image.jt.com/yyyy/MM/dd/adc.jpg
        String urlPath=preUrl+virtualPath;
        ImageVO imageVO = new ImageVO(virtualPath,urlPath,fileName);
            System.out.println(urlPath);
        return imageVO;
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    @Override
    public void deleteFile(String virtualPath) {
        String path = localDir+virtualPath;
        File file = new File(path);
        if (file.exists()){
            file.delete();
        }
    }

    /**
     * 实现文件上传操作
     * 1.获取文件上传的文件名
     * 2.准备文件上传的目录
     * 3.实现文件上传
     *
     * 注意事项：图片大小不能超过2M
     * @param file
     * @return
     */
//    @Override
//    public ImageVO upload(MultipartFile file) {
//        //1.获取文件上传的文件名
//        String fileName= file.getOriginalFilename();
//        //2.指定磁盘路径信息
//        String filePath = "E:/images";
//        //3.校验目录是否存在
//        File dirFile = new File(filePath);
//        if(!dirFile.exists()){
//            dirFile.mkdirs();// 创建目录
//        }
//        //4.准备文件的全路径
//        String path = filePath+"/"+fileName;
//        //5.将路径包装为File对象
//        File imageFile = new File(path);
//        //6.实现文件上传
//        try {
//            file.transferTo(imageFile);
//        }   catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return null;
//    }
}
